package com.java.base.exercise.limitrate;

/**
 * @Author RenPu
 * @Date 2023/3/17 13:42
 * @Version 1.0
 * @Description: 基于计数器完成限流的实现
 *               限流算法：计数器
 *               优点：实现简单
 *               缺点：在时间的临界点可能会出现超出系统的访问能力
 **/
public class CounterLimit {

    //记录一个时间
   private static long timestamp=System.currentTimeMillis();

    //设定时间间隔（毫秒）
    private static long timeCycle=1000;

    //设定限流触发的请求数量值
    private static int countLimit=100;
    //记录请求数据
    private static int reqCount=0;


    public static boolean grand(){
        //1：先判断是否符合时间间隔范围
        long now = System.currentTimeMillis();
        if(now<timestamp+timeCycle){
            //2:再进行根据当前请求数量的值与设置的限流请求数量值进行比较，如果小于则进行请求数维护返回true，
            // 反之进行触发限流操作返回false
            if(reqCount<countLimit){
                reqCount++;
                return true;
            }else {
                return false;

            }
        }else {
            timestamp=System.currentTimeMillis();
            reqCount=0;
            return false;

        }

    }


    public static void main(String[] args) {
        for (int i = 0; i < 500; i++) {
            int finalI = i;
            new Thread(()->{
                int index= finalI;
                if(grand()){
                    System.out.println("开始执行业务逻辑方法......."+index);
                }else {
                    System.out.println("限流......."+index);

                }

            }).start();
        }
    }





}
